loop
/recur
এর মাধ্যমে Tail-Recursive Loopingক্লোজারে (Clojure) tail-recursive looping বাস্তবায়ন করার জন্য loop
এবং recur
ব্যবহার করা হয়। এই দুটি ফাংশন একসাথে কাজ করে এবং tail recursion এর সুবিধা প্রদান করে, যেখানে রিকার্সিভ কলের শেষ অংশে কোনো অতিরিক্ত কাজ থাকে না, ফলে মেমোরি ব্যবহার সাশ্রয়ী হয় এবং স্ট্যাক ওভারফ্লো এর ঝুঁকি কমে।
loop
/recur
কী?loop
: এটি একটি লুপের মতো ব্যবহৃত হয়, যা নির্দিষ্ট সংখ্যা বা শর্ত পূর্ণ না হওয়া পর্যন্ত পুনরাবৃত্তি করতে সাহায্য করে। এটি চলতে থাকা প্রোগ্রাম কনট্রোলের জন্য কিছু স্থির মান বা অবস্থান নির্ধারণ করে।recur
: এটি loop
বা রিকার্সিভ ফাংশনের মধ্যে নিজেকে পুনরায় কল করতে ব্যবহৃত হয়। এটি স্ট্যাক ওভারফ্লো সমস্যা ছাড়া কার্যকরীভাবে টেইল রিকার্সন তৈরি করতে সাহায্য করে, কারণ recur
কোনো নতুন স্ট্যাক ফ্রেম তৈরি না করে বর্তমান ফ্রেমে কাজ চালিয়ে যায়।loop
এবং recur
এর মাধ্যমে Tail-Recursive Looping উদাহরণ(defn factorial [n]
(loop [acc 1
num n]
(if (<= num 1)
acc
(recur (* acc num) (dec num)))))
এখানে loop
দিয়ে একটি লুপ শুরু করা হয়েছে এবং recur
এর মাধ্যমে ফাংশনকে আবার কল করা হয়েছে, কিন্তু কোনো নতুন স্ট্যাক ফ্রেম তৈরি না করে। acc
একটি অ্যাকিউমুলেটর (accumulator) হিসেবে কাজ করছে, যা ফ্যাক্টরিয়াল গণনার জন্য আগের ফলাফলের সাথে বর্তমান মানকে গুণ করছে। এইভাবে, শেষের রিকার্সন কলের পর কোনো অতিরিক্ত কাজ হয় না, এবং মেমোরি ব্যবহার দক্ষ থাকে।
loop
এর মধ্যে acc
এবং num
নামের দুটি ভ্যারিয়েবল নির্ধারণ করা হয়েছে। acc
হচ্ছে ফ্যাক্টরিয়াল গণনার জন্য ইনিশিয়াল মান, এবং num
হচ্ছে ডেটার বর্তমান মান।(<= num 1)
চেক করা হচ্ছে, যদি num
1 এর সমান বা ছোট হয়, তবে acc
রিটার্ন করা হবে, অন্যথায় recur
দিয়ে পুনরায় কল করা হবে।recur
পরবর্তী রিকার্সন কলের জন্য অ্যাকিউমুলেটর acc
আপডেট করে এবং num
এর মান 1 কমায়। এতে কোনো নতুন স্ট্যাক ফ্রেম তৈরি হয় না এবং এই কল বর্তমান ফ্রেমে সম্পন্ন হয়।(defn fibonacci [n]
(loop [a 0
b 1
count n]
(if (<= count 0)
a
(recur b (+ a b) (dec count)))))
এখানে loop
এবং recur
এর মাধ্যমে ফিবোনাচি সিরিজ গণনা করা হচ্ছে। a
এবং b
ফিবোনাচি সিরিজের আগের দুটি মান, এবং count
হলো ফিবোনাচি সংখ্যার অবস্থান।
loop
-এ তিনটি ভ্যারিয়েবল: a
, b
, এবং count
ব্যবহৃত হচ্ছে। a
এবং b
ফিবোনাচি সিরিজের দুটি আগের মান, এবং count
বাকি পদ সংখ্যা।(<= count 0)
চেক করা হয়, যদি count
0 বা তার চেয়ে ছোট হয়, তখন a
রিটার্ন করা হয়, যা ফিবোনাচি সংখ্যার মান।recur
পরবর্তী রিকার্সন কলের জন্য a
এবং b
এর মান আপডেট করে, এবং count
এর মান 1 কমায়।loop
/recur
এর সুবিধাrecur
এর মাধ্যমে কোনো নতুন স্ট্যাক ফ্রেম তৈরি না হওয়ায়, মেমোরি ব্যবহারের সমস্যা যেমন স্ট্যাক ওভারফ্লো এড়ানো যায়।loop
এবং recur
এর মাধ্যমে তা কমিয়ে দেয়।বৈশিষ্ট্য | loop /recur | সাধারণ রিকার্সন |
---|---|---|
স্ট্যাক ব্যবস্থাপনা | স্ট্যাক ফ্রেম পুনঃব্যবহার করে | প্রতিটি রিকার্সন কল নতুন স্ট্যাক ফ্রেম তৈরি করে |
কার্যক্ষমতা | মেমোরি সাশ্রয়ী এবং কার্যকর | গভীর রিকার্সনে স্ট্যাক ওভারফ্লো হতে পারে |
বৈশিষ্ট্য | টেইল রিকার্সন, মেমোরি দক্ষ | স্ট্যাক ওভারফ্লো ঝুঁকি এবং কম কার্যক্ষম |
ক্লোজারে loop
এবং recur
ব্যবহার করে tail-recursive looping একটি শক্তিশালী কৌশল, যা মেমোরি ব্যবহার সাশ্রয়ী এবং কার্যক্ষমভাবে পুনরাবৃত্তি সম্পাদন করতে সাহায্য করে।
common.read_more